#include "tp2.h"

  void nome(char* nomes){
    int i=0,j=FALSE;
    char c,s[tmtitulo+1];
    printf("Entre com o titulo da obra e pressione ENTER:\n");
    scanf("%c",&c);
  /*
   * A utiliza�ao de um duplo scanf("%c",&c) serve para que se retire o \n
   * do inicio do programa na verifica�ao da opcao escolhida pelo
   * usuario e permitindo, assim, a entrada de dados da obra.
   */
    scanf("%c",&c);
  /*
   * O la�o abaixo serve para verificar a entrada do caracter
   * de nova linha \n, caso este nao seja recebido e outros
   * caracteres sejam digitados, estes sao inseridos em um vetor,
   * onde, posteriormente, sera verificado se houve estouro no
   * numero de caracteres. Caso este numero for menor que 200,
   * o vetor sera completado, entao, com o caracter de espa�o.  
   */
    while(c=='\n'){
      printf("O titulo da obra deve conter no minimo 1 caractere!\n");
      scanf("%c",&c);
    }
    while(c!='\n'){
      j=TRUE;
      s[i]=c;
      i++;
      if(i>tmtitulo){
        printf("O titulo da obra deve conter no maximo 200 caracteres!\n");
        i=0;
        printf("Digite novamente!\n");
  /*
   * Esta parte do codigo busca o ENTER (\n) na entrada feita pelo usuario.
   */ 
        while(c!='\n'){
          scanf("%c",&c);
        }
        j=FALSE;
      }
      scanf("%c",&c);
      if(s[0]==' '){
        i=0;
        j=FALSE;
      }
      if(j==FALSE && i==0){
        while(c=='\n'){
          printf("O titulo da obra deve conter no minimo 1 caractere!\n");
          scanf("%c",&c);
        }
      }
    }
  /*
   * Insere-se no final do vetor o \n para que, posteriormente, se complete
   * com espa�os e seja gravado no arquivo.
   */
    s[i]='\n';
    i=0;
    while(s[i]!='\n'){
      i++;
    }
    while(i<=(tmtitulo-1)){
      s[i]=' ';
      i++;
    }
    for(i=0;i<=(tmtitulo-1);i++){
      nomes[i]=s[i];
    }
  }
 
  /*
   * Como as fun�oes possuem alguns conceitos identicos entre si, parte dos
   * comentarios serao desconsiderados.Como por exemplo a fun�ao tipo, autor e
   * nome da obra possuem codigos muito semelhantes entre si, assim como data e valor.
   */
  void tipo(char* tipos){
    int i=0,j=FALSE;
    char c,s[tmtipo+1];
    printf("Entre com o tipo da obra (EX:oleo sobre tela, gravura, etc) e pressione ENTER:\n");
    scanf("%c",&c);
    while(c=='\n'){
      printf("O tipo de obra deve conter no minimo 1 caractere!\n");
      scanf("%c",&c);
    }
    while(c!='\n'){
      s[i]=c;
      i++;
      if(i>tmtipo){
        printf("O tipo da obra deve conter no maximo 100 caracteres!\n");
        i=0;
        printf("Digite novamente!\n");
        while(c!='\n'){
          scanf("%c",&c);
        }
      j=FALSE;
      }
      scanf("%c",&c);
      if(s[0]==' '){
        i=0;
        j=FALSE;
      }
      if(j==FALSE && i==0){
        while(c=='\n'){
          printf("O tipo da obra deve conter no minimo 1 caractere!\n");
          scanf("%c",&c);
        }
      }
    }
    s[i]='\n';
    i=0;
    while(s[i]!='\n'){
      i++;
    }
    while(i<=(tmtipo-1)){
      s[i]=' ';
      i++;
    }
    for(i=0;i<=(tmtipo-1);i++){
      tipos[i]=s[i];
    }
  }

  void autor(char* autors){
    int i=0,j=FALSE;
    char c,s[tmautor+1];
    printf("Entre com o nome do autor da obra e pressione ENTER:\n");
    scanf("%c",&c);
    while(c=='\n'){
      printf("O autor da obra deve conter no minimo 1 caractere!\n");
      scanf("%c",&c);
    }
    while(c!='\n'){
      s[i]=c;
      i++;
      if(i>tmautor){
        printf("O nome do autor deve conter no maximo 125 caracteres!\n");
        i=0;
        printf("Digite novamente!\n");
        while(c!='\n'){
          scanf("%c",&c);
        }
      j=FALSE;
      }
      scanf("%c",&c);
      if(s[0]==' '){
        i=0;
        j=FALSE;
      }      
      if(j==FALSE && i==0){
        while(c=='\n'){
          printf("O autor da obra deve conter no minimo 1 caractere!\n");
          scanf("%c",&c);
        }
      }
    }
    s[i]='\n';
    i=0;

    while(s[i]!='\n'){
      i++;
    }
    while(i<=(tmautor-1)){
      s[i]=' ';
      i++;
    }
    for(i=0;i<=(tmautor-1);i++){
      autors[i]=s[i];
    }
  }

  void ano(char* anos){
  /*
   * Ambas as variaveis servem para verificar se a entrada digitada pelo usuario,
   * esta dentro dos padroes especificados neste lab.
   */
    int i=0,t=FALSE;
    char c,s[tmano+1];
    printf("Entre com o ano da obra (4 numeros) e pressione ENTER:\n");
    scanf("%c",&c);
    while(t==FALSE){
      while(c!='\n'){
  /*
   * Verifica�ao caso a entrada possua alguma letra em sua extensao.
   */
        if(isdigit(c)==0){
          printf("O ano deve conter apenas numeros. Digite novamente!\n");
          i=0;
            while(c!='\n'){
              scanf("%c",&c);
            }
          }
        else{
          s[i]=c;
          i++;
        }
  /*
   * Como o ano possui 4 caracteres exatos, nao pode, entao, haver qualquer
   * entrada com menos ou mais do que 4 caracteres.
   */
        if(i>tmano){
          printf("O ano deve conter somente 4 caracteres. Digite novamente!\n");
          i=0;
          while(c!='\n'){
            scanf("%c",&c);
          }           
        }
        scanf("%c",&c);
      }
      if(i<tmano){
        printf("O ano deve conter somente 4 caracteres. Digite novamente!\n");
        i=0;
        t=FALSE;
        scanf("%c",&c);
      }
      else{
        t=TRUE;
      }
    }
    i=0;
    while(i<tmano){
      anos[i]=s[i];
      i++;
    }
  }

  void valor(char* valors){
    int k=0,i=0,j=0,t=FALSE;
    char c,s2[tmvalor+1],s[tmvalor+1];
    printf("Entre com o valor da obra (12 numeros) e pressione ENTER:\n");
    scanf("%c",&c);
    while(c=='\n'){
      printf("O valor da obra deve conter no minimo 1 caractere!\n");
      scanf("%c",&c);
    }
    while(t==FALSE){
      while(c!='\n'){
        if(isdigit(c)==0){
          printf("O valor da obra deve conter apenas numeros. Digite novamente!\n");
          i=0;
          while(c!='\n'){
            scanf("%c",&c);
          }
        }
        else{
          s[i]=c;
          i++;
        }
        if(i>tmvalor){
          printf("O valor da obra deve conter no maximo 12 caracteres. Digite novamente!\n");
          i=0;
          while(c!='\n'){
            scanf("%c",&c);
          }           
        }
        scanf("%c",&c);
      }
      if(i<tmvalor){
        k=((tmvalor)-i);
        for(j=0;j<=k;j++){
          s2[j]='0';
        }
        for(j=0;j<=i;j++){
          s2[j+k]=s[j];
        }
        for(j=0;j<=tmvalor-1;j++){
          s[j]=s2[j];
        }
        t=TRUE;
      }
      else{
        t=TRUE;
      }
    }
    i=0;
    while(i<tmvalor){
      valors[i]=s[i];
      i++;
    }
  }

  void imagem(char* imagems){
    char c,s[tmimagem+1];
  /*
   * O aumento do numero de variaveis, tem a finalidade de agir como confirma�oes
   * de cada parte das verifica�oes da entrada.
   */
    int i=0,t=FALSE,n=FALSE,l=FALSE;
    printf("Entre com o registro da obra (4 numeros e 3 letras EX:0001png) e pressione ENTER:\n");
    while(l==FALSE){
      scanf("%c",&c);
  /*
   * Recebe-se, primeiramente, a entrada completa dos 7 caracteres, verificando-se,
   * iniciamente, somente se o numero de caracteres eh compativel.
   */
      while(c!='\n'){
        s[i]=c;
        i++;
        if(i>tmimagem){
          printf("Formato invalido. Digite 4 numeros e 3 letras!\n");
          i=0;
          while(c!='\n'){
            scanf("%c",&c);
          }
        }
        scanf("%c",&c);
      }
      if(i<tmimagem){
        printf("Formato invalido. Digite 4 numeros e 3 letras!\n");
      }
      else{
        t=TRUE;
      }
  /*
   * Passado o primeiro teste, eh verificado se o usuario digitou 4 numeros,
   * caso seja falso, retorna-se ao inicio do la�o, obrigando o usuario a 
   * entrar novamente com o codigo da imagem.
   */
      i=0;
      while((i<(tmimagem - 3))&&(t==TRUE)){
        if(isdigit(s[i])!=0){
          i++;
        }
        else{
          printf("Formato invalido. Digite 4 numeros e 3 letras!\n");
          t=FALSE;
          i=FALSE;
        }
      }
      if((isalpha(s[i])==0)&&(t==TRUE)){
        printf("Formato invalido. Digite 4 numeros e 3 letras!\n");
        i=0;
        t=FALSE;
        n=FALSE;
      }
      else{
        n=TRUE;
      }
  /*
   * Verifica-se agora, caso a parte final sejam 3 letras, caso contrario, o usuario
   * eh obrigado a digitar novamente a entrada.
   */
      while((i<tmimagem)&&(n==TRUE)&&(t==TRUE)){
        if(isalpha(s[i])!=0){
          i++;
        }
        else{
          printf("Formato invalido. Digite 4 numeros e 3 letras!\n");
          t=FALSE;
          i=0;
          n=FALSE;
        }
      }
      if((t==TRUE)&&(n==TRUE)){
        l=TRUE;
      }
      i=0;
      n=FALSE;
      t=FALSE;
    }
    imagems[0]='2';
    imagems[1]='0';
    for(i=0;i<=(tmimagem-1);i++){
      imagems[i+2]=s[i];
    }
  }

  /*
   * Le e grava os dados da obra que deseja
   * ser inserida.
   */
  int insere(int *reg,PK *lista,int *nSKtit,int *nSKtip,int *nSKaut,int *nSKano,PK *listaSKtit,PK *listaSKtip,PK *listaSKaut,PK *listaSKano){
    int a=0, e=0;
    FILE *arq, *avail, *base;
    char test[200];
    dados bncdados = (dados)malloc(sizeof(struct dados));
    arq=fopen("base20.dat","a+");
    nome(bncdados->nomes);
    tipo(bncdados->tipos);
    autor(bncdados->autors);
    ano(bncdados->anos);
    valor(bncdados->valors);
    imagem(bncdados->imagems);
    fwrite(bncdados, 1, sizeof(struct dados), arq);
    (*reg)++;
    AdicionaPK(lista,bncdados->nomes,*reg);
    while((bncdados->nomes[a]!=' ')&&(a<200)){
      while((bncdados->nomes[a]!=' ')&&(a<200)){
        test[e]=bncdados->nomes[a];
        a++;
        e++;
      }
      while(e<200){
        test[e]=' ';
        e++;
      }
      e=0;
      a++;
      avail=fopen("availtitulo.dat","r+");
      base=fopen("listatitulo.dat","r+");
      AdicionaSK(test, bncdados->nomes, listaSKtit, nSKtit, base, avail, 200);
      fclose(base);
      fclose(avail);
    }
    e=0;
    a=0;
    while((bncdados->tipos[a]!=' ')&&(a<100)){
      while((bncdados->tipos[a]!=' ')&&(a<100)){
        test[e]=bncdados->tipos[a];
        a++;
        e++;
      }
      while(e<200){
        test[e]=' ';
        e++;
      }
      e=0;
      a++;
      avail=fopen("availtipo.dat","r+");
      base=fopen("listatipo.dat","r+");
      AdicionaSK(test, bncdados->tipos, listaSKtip, nSKtip, base, avail, 100);
      fclose(base);
      fclose(avail);
    }
    e=0;
    a=0;
    while((bncdados->autors[a]!=' ')&&(a<125)){
      while((bncdados->autors[a]!=' ')&&(a<125)){
        test[e]=bncdados->autors[a];
        a++;
        e++;
      }
      while(e<200){
        test[e]=' ';
        e++;
      }
      e=0;
      a++;
      avail=fopen("availautor.dat","r+");
      base=fopen("listaautor.dat","r+");
      AdicionaSK(test, bncdados->autors, listaSKaut, nSKaut, base, avail, 125);
      fclose(base);
      fclose(avail);
    }
    a=0;
    while(a<4){
      test[a]=bncdados->anos[a];
      a++;
    }
    while(a<200){
      test[a]=' ';
      a++;
    }
    avail=fopen("availano.dat","r+");
    base=fopen("listaano.dat","r+");
    AdicionaSK(test, bncdados->anos, listaSKano, nSKano, base, avail, 4);
    printf("ajsdhajds\n");
    fclose(base);
    printf("ajsdhajds\n");
    fclose(avail);
    printf("ajsdhajds\n");
    free(bncdados);
    printf("ajsdhajds\n");
    fclose(arq);
    printf("ajsdhajds\n");
    return TRUE;
  }
